/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import DataTypes.DataComentario;
import DataTypes.DataContenido;
import DataTypes.DataGrupo;
import Hndlr.HndlrGrupo;
import Hndlr.HndlrUsuario;
import Interfaces.Factory;
import Interfaces.ICtrlAgregarEntradaMuro;
import Interfaces.ICtrlDetallesGrupo;
import enums.EnumAprob;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import objetos.Comentario;
import objetos.Contenido;
import objetos.Documento;
import objetos.Grupo;
import objetos.Imagen;
import objetos.Remoto;
import objetos.Textos;
import objetos.Usuario;
import objetos.Video;

/**
 *
 * @author Sebas
 */
public class CtrlAgregarEntradaMuro implements ICtrlAgregarEntradaMuro {

    @Override
    public ArrayList<DataGrupo> listarGrupos() {
        HndlrGrupo Hgrupo = HndlrGrupo.getInstance();
        return Hgrupo.listarGrupos();
    }

    @Override
    public void agregarContImagen(String titulo, String url, String muro, String autor, String tipoContenido, boolean admin) {
        //Para grupos.
        if (tipoContenido.equals("Imagen")) {


            Contenido contImg = new Imagen(titulo, url, autor);
            if (admin) {
                contImg.setAprobacion(EnumAprob.APROBADO);
                contImg.setPublicar(true);
            }
            if (HndlrGrupo.getInstance().containsKey(muro)) {
                HndlrGrupo.getInstance().obtenerGrupo(muro).agregarContenidoMuro(contImg);
            } else {
                contImg.setAprobacion(EnumAprob.APROBADO);
                HndlrUsuario.getInstance().obtenerUsuario(muro).agregarContenidoMuro(contImg);
            }
        }

    }

    @Override
    public void agregarContTexto(String nomContenido, String cuerpoTexto, String muro, String autor, String tipoContenido, boolean admin) {
        if (tipoContenido.equals("Texto")) {

            Contenido contImg = new Textos(nomContenido, cuerpoTexto, autor);
            if (admin) {
                contImg.setAprobacion(EnumAprob.APROBADO);
                contImg.setPublicar(true);
            }
            if (HndlrGrupo.getInstance().containsKey(muro)) {
                HndlrGrupo.getInstance().obtenerGrupo(muro).agregarContenidoMuro(contImg);
            } else {
                contImg.setAprobacion(EnumAprob.APROBADO);
                HndlrUsuario.getInstance().obtenerUsuario(muro).agregarContenidoMuro(contImg);
            }

        }
    }

    @Override
    public void agregarContVideo(String titulo, String url, String muro, String autor, String tipoContenido) {
        //Para grupos.
        if (tipoContenido.equals("Video")) {

            Contenido contImg = new Video(titulo, url, autor);
            if (HndlrGrupo.getInstance().containsKey(muro)) {
                HndlrGrupo.getInstance().obtenerGrupo(muro).agregarContenidoMuro(contImg);
            } else {
                contImg.setAprobacion(EnumAprob.APROBADO);
                HndlrUsuario.getInstance().obtenerUsuario(muro).agregarContenidoMuro(contImg);
            }

        }
    }

    @Override
    public void agregarContDocumento(String titulo, String url, String muro, String autor, String tipoContenido) {
        //Para grupos.
        if (tipoContenido.equals("Documento")) {

            Contenido contImg = new Documento(titulo, url, autor);
            if (HndlrGrupo.getInstance().containsKey(muro)) {
                HndlrGrupo.getInstance().obtenerGrupo(muro).agregarContenidoMuro(contImg);
                ICtrlDetallesGrupo ctrlDetalles = Factory.getInstance().getDetallesGrupo();
                if (ctrlDetalles.detallarGrupo(muro).getCreador().equals(autor)
                        || ctrlDetalles.detallarGrupo(muro).getModeradores().contains(autor)) {
                    ctrlDetalles.aprobarContenido(muro, titulo, true);
                    ctrlDetalles.publicarContenido(muro, titulo);
                }
            } else {
                contImg.setAprobacion(EnumAprob.APROBADO);
                HndlrUsuario.getInstance().obtenerUsuario(muro).agregarContenidoMuro(contImg);
            }
        }

    }

    @Override
    public void agregarContenido(DataContenido datC, String muro) {

        Contenido cont = null;

        if (datC.getTipo().equals("Documento")) {
            cont = new Documento(datC.getTitulo(), datC.getUrl(), datC.getAutor().getCorreo());
        }

        if (datC.getTipo().equals("Imagen")) {
            cont = new Imagen(datC.getTitulo(), datC.getUrl(), datC.getAutor().getCorreo());
        }

        if (datC.getTipo().equals("Video")) {
            cont = new Video(datC.getTitulo(), datC.getUrl(), datC.getAutor().getCorreo());
        }

        if (datC.getTipo().equals("Texto")) {
            cont = new Textos(datC.getTitulo(), datC.getCuerpo(), datC.getAutor().getCorreo());
        }
        if (datC.getTipo().equals("Remoto")) {
            cont = new Remoto(datC.getTitulo(), datC.getUrl(), datC.getAutor().getCorreo());
        }

        cont.setFechaPublicacion(datC.getFechaPublicacion());
        cont.setBloqueado(datC.isBloqueado());
        cont.setAprobacion(datC.getAprobacion());
        ArrayList<Comentario> listCom = new ArrayList<Comentario>();
        Iterator<DataComentario> it = datC.getComentarios().iterator();
        DataComentario dC;
        while (it.hasNext()) {
            dC = it.next();
            Comentario c = new Comentario(dC);
            listCom.add(c);

        }

        cont.setComentarios(listCom);

        if (HndlrGrupo.getInstance().containsKey(muro)) {
            HndlrGrupo.getInstance().obtenerGrupo(muro).agregarContenidoMuro(cont);
        } else {
            cont.setAprobacion(EnumAprob.APROBADO);
            HndlrUsuario.getInstance().obtenerUsuario(muro).agregarContenidoMuro(cont);

        }
    }

    @Override
    public void etiquetarImagen(String titCont, Calendar fechaPub, String correoDuenoMuro, ArrayList<String> correoEtiquetado, boolean esGrupo) {

        if (esGrupo) {
            HndlrGrupo.getInstance().obtenerGrupo(correoDuenoMuro).etiquetarImagen(titCont, fechaPub, correoEtiquetado);
        } else {
            HndlrUsuario.getInstance().obtenerUsuario(correoDuenoMuro).etiquetarImagen(titCont, fechaPub, correoEtiquetado);
        }
    }

    @Override
    public void quitarEtiquetaImagen(String titCont, Calendar fechaPub, String correoDuenoMuro, String correoEtiquetado, boolean esGrupo) {



        if (esGrupo) {
            HndlrGrupo.getInstance().obtenerGrupo(correoDuenoMuro).quitarEtiquetaImg(titCont, fechaPub, correoEtiquetado);
        } else {
            HndlrUsuario.getInstance().obtenerUsuario(correoDuenoMuro).quitarEtiquetaImg(titCont, fechaPub, correoEtiquetado);
        }
    }

    @Override
    public ArrayList<DataContenido> ContenidoEtiquetadoUsr(String correoUsr) {
        ArrayList<DataContenido> result = new ArrayList<DataContenido>();

        Iterator<Usuario> iteraAmigos = HndlrUsuario.getInstance().listaUsuarios().values().iterator();
        Iterator<Contenido> iteraCont = null;
        Contenido cont = null;
        Usuario amigo = null;
        DataContenido dCont = null;

        while (iteraAmigos.hasNext()) {
            amigo = iteraAmigos.next();
            if (!amigo.getCorreo().equals(correoUsr)) {
                iteraCont = amigo.getMuro().getContenidosObjeto().iterator();

                while (iteraCont.hasNext()) {
                    cont = iteraCont.next();

                    if (cont.isEtiquetadoUsr(correoUsr)) {
                        dCont = cont.getContenido();
                        dCont.setIdMuro(amigo.getCorreo());
                        dCont.setPerteneceGrupo(false);
                        result.add(dCont);
                    }
                }
            }
        }

        Iterator<Grupo> iteraGrupos = HndlrGrupo.getInstance().listarGruposObjeto().values().iterator();
        Grupo grupo = null;
        while (iteraGrupos.hasNext()) {
            grupo = iteraGrupos.next();
            iteraCont = grupo.getMuro().getContenidosObjeto().iterator();
            while (iteraCont.hasNext()) {
                cont = iteraCont.next();

                if (cont.isEtiquetadoUsr(correoUsr)) {
                    dCont = cont.getContenido();
                    dCont.setIdMuro(grupo.getNombre());
                    dCont.setPerteneceGrupo(true);
                    result.add(dCont);
                }
            }
        }

        return result;

    }
}
